當類是定義在其他的類裡面時,可以說它是內部類
。
可以定義的位置:
class
構造器
初始化區塊
方法
類只會使用public
、default
進行權限的修飾。
內部類可以使用4種權限修飾(private
、default
、protected
、public
),並且也可以使用static
將內部類變成靜態
。
public class A {
public class B {}
public static class C {}
public A() {
public class D {}
}
{
public class E {}
}
public void method() {
public class F {
void method() {
System.out.println("方法中的局部內部類");
}
}
F f = new F();
f.method(); // 方法中的局部內部類
}
}
當要實例化一個內部類時使用這樣的方式:
public class Test {
public static void main(String[] args) {
A a = A.new B();
A b = new A.C();
}
}
非靜態
內部類實例化:A a = A.new B();
,要記得super class
的型別是放在new
的前面。靜態
內部類實例化:A b = new A.C();
,這邊是使用A.
的方式,因為C
是靜態內部類
,所以當A
載入時,就已經存在了,只是尚未被實例化。在方法中定義一個局部內部類,並且用一般實例化類的方式後使用類的方法。
public class A {
public void method() {
public class F {
void method() {
System.out.println("方法中的局部內部類");
}
}
F f = new F();
f.method(); // 方法中的局部內部類
}
}
運用多態
的概念定義了一個繼承
了B
的匿名類。
public class A {
public void method() {
B b = new B() {
@override
void method() {
System.out.println("方法中的局部匿名內部類1");
}
}
b.method(); //方法中的局部匿名內部類1
}
}
public class B {
void method() {
System.out.println("方法中的局部內部類");
}
}
💡雖然b
看起來好像是B
的類別,但實際上它是透過多態
的方式,繼承
了B
的匿名類
。
這邊可以看到,在new B()
這個構造器後面加上了{}
。
完全匿名,連物件的名稱都沒有。
public class A {
public void method() {
new B() {
@override
void method() {
System.out.println("方法中的局部匿名內部類1");
}
}.method(); //方法中的局部匿名內部類1
}
}
public class B {
void method() {
System.out.println("方法中的局部內部類");
}
}
💡也可以使用這種方式,連物件都不宣告了,直接在匿名類
的後面使用匿名類
中的方法
。
一般在開發中較少使用到內部類
的形式,但是匿名類
還是有機會會遇到~~~